#include"maze.h"
void Maze::init(int n){
    if(next.size()){
        next.clear();
    }

    for(int i=0;i<MAP_ROW;i++){
        for(int j=0;j<MAP_COL;j++){
           map[i][j].flag=-1;
           map[i][j].x=i;
           map[i][j].y=j;
           map[i][j].flagNext=-1;
        }
    }
    this->n=n;
    b=true;
    map[2][2].flag =1;
    next.append(map[2][2]);
//初始化参数
    addTemp[0][0]=2;
    addtemp[0][0]=1;
    addTemp[0][1]=0;
    addtemp[0][1]=0;
    addTemp[1][0]=0;
    addtemp[1][0]=0;
    addTemp[1][1]=2;
    addtemp[1][1]=1;
    addTemp[2][0]=-2;
    addtemp[2][0]=-1;
    addTemp[2][1]=0;
    addtemp[2][1]=0;
    addTemp[3][0]=0;
    addtemp[3][0]=0;
    addTemp[3][1]=-2;
    addtemp[3][1]=-1;
    //设置边界
    for(int i=0;i<n+3;i++){
        map[0][i].flag=0;
        map[1][i].flag=0;
        map[n+1][i].flag=0;
        map[n+2][i].flag=0;
        map[i][0].flag=0;
        map[i][1].flag=0;
        map[i][n+1].flag=0;
        map[i][n+2].flag=0;

        map[0][i].flagNext=0;
        map[1][i].flagNext=0;
        map[n+1][i].flagNext=0;
        map[n+2][i].flagNext=0;
        map[i][0].flagNext=0;
        map[i][1].flagNext=0;
        map[i][n+1].flagNext=0;
        map[i][n+2].flagNext=0;
    }
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
}
//创建迷宫
 void Maze::mapBuid(){
     cnt=next.size();
     if(cnt){
         int i=qrand()%cnt;
            next[i].flag=1;
            int addt=qrand()%4;
         for(int k=0;k<4;k++){
             if(map[next[i].x+addTemp[(addt+k)%4][0]][next[i].y+addTemp[(addt+k)%4][1]].flag==-1){
                 for(int j=0;j<cnt;j++){
                     if(next[j].x==next[i].x+addTemp[(addt+k)%4][0] && next[j].y==next[i].y+addTemp[(addt+k)%4][1]){
                         break;
                     }else if(j==cnt-1){
                         next.append(map[next[i].x+addTemp[(addt+k)%4][0]][next[i].y+addTemp[(addt+k)%4][1]]);
                         map[next[i].x+addtemp[(addt+k)%4][0]][next[i].y+addtemp[(addt+k)%4][1]].flag=1;
                         map[next[i].x+addTemp[(addt+k)%4][0]][next[i].y+addTemp[(addt+k)%4][1]].flag=1;
                     }
                 }
             }
         }
         next.removeAt(i);
         mapBuid();
     }
 }

//自动寻路
 void Maze::mapSearch(){
     if(b){
         for(int i=2;i<n+1;i++){
             for(int j=2;j<n+1;j++){
                 map[i][j].flagNext=-1;
             }
         }
         if(route.size()){
             route.clear();
         }
         map[startP.x][startP.y].flagNext=1;
         route.append(startP);
         b=false;
     }
      cnt=route.size();
    if(route[cnt-1].x!=endP.x || route[cnt-1].y!=endP.y){
      if((map[route[cnt-1].x+1][route[cnt-1].y].flagNext==-1) && (map[route[cnt-1].x+1][route[cnt-1].y].flag==1)){
          route.append(map[route[cnt-1].x+1][route[cnt-1].y]);
          map[route[cnt-1].x+1][route[cnt-1].y].flagNext=1;
      }else if((map[route[cnt-1].x][route[cnt-1].y+1].flagNext==-1) && (map[route[cnt-1].x][route[cnt-1].y+1].flag==1)){
          route.append(map[route[cnt-1].x][route[cnt-1].y+1]);
          map[route[cnt-1].x][route[cnt-1].y+1].flagNext=1;
      }else if((map[route[cnt-1].x-1][route[cnt-1].y].flagNext==-1) && (map[route[cnt-1].x-1][route[cnt-1].y].flag==1)){
          route.append(map[route[cnt-1].x-1][route[cnt-1].y]);
          map[route[cnt-1].x-1][route[cnt-1].y].flagNext=1;
      }else if((map[route[cnt-1].x][route[cnt-1].y-1].flagNext==-1) && (map[route[cnt-1].x][route[cnt-1].y-1].flag == 1)){
          route.append(map[route[cnt-1].x][route[cnt-1].y-1]);
          map[route[cnt-1].x][route[cnt-1].y-1].flagNext=1;
      }else{
           route.removeAt(cnt-1);
      }
      mapSearch();
    }

 }
